The Calendar view will display each child note in a calendar that has a start date and optionally an end date, as an event.
The Calendar view has multiple display modes:
Unlike other Collection view types, the Calendar view also allows some kind of interaction, such as moving events around as well as creating new ones.
Right click on an existing note in the Note Tree and select Insert child note and look for Calendar.
To create a new event:
In either cases, a small popup will show with a prompt for a title and the date & time of the event that will be created.
At this point, the event hasn't been created yet to protect against accidental clicks. Add a title optionally and press the Create button. If no title is provided, the event will follow the Default Note Title rules.
After creating the event, it will show up on the calendar. To edit the content of the event (including recurrence), click on it to bring it into the popup view.
When an event is clicked, a popup will show near the event which contains the following inforamtion:
To dismiss the popup:
It is possible to switch between events by clicking on them even when the popup view is already open.
Events can have Internal (reference) links between them and clicking on such a link will automatically navigate the calendar to the right date and the popup view to the new note.
When Trilium is on mobile, the interaction with the calendar is slightly different:
In the Collections tab in the Ribbon, it's possible to adjust the following:
The following attributes can be added to the Collection type:
| Name | Description |
|---|---|
#calendar:hideWeekends
|
When present (regardless of value), it will hide Saturday and Sundays from the calendar. |
#calendar:weekNumbers
|
When present (regardless of value), it will show the number of the week on the calendar. |
#calendar:initialDate
|
Change the date the calendar opens on. When not present, the calendar opens on the current date. |
#calendar:view
|
Which view to display in the calendar:
Any other value will be dismissed and the default view (month) will be used instead. The value of this label is automatically updated when changing the view using the UI buttons. |
#calendar:slotDuration
|
Sets how long each timeslot is on the calendar. Defaults to 00:15:00 (15
minutes). Must have the format "HH:MM:SS". For example, to create timeslots
for every 10 minutes, you would set #calendar:slotDuration="00:10:00". |
#calendar:slotLabelInterval
|
Sets how often the timeslots on the calendar should be labeled. Defaults
to 01:00:00 (1 hour). Must have the format
"HH:MM:SS". For example, to label timeslots every 30 minutes, you would
set #calendar:slotLabelInterval="00:30:00". |
~child:template
|
Defines the template for newly created notes in the calendar (via dragging or clicking). |
In addition, the first day of the week can be either Sunday or Monday and can be adjusted from the application settings.
For each note of the calendar, the following attributes can be used:
| Name | Description |
|---|---|
#startDate
|
The date the event starts, which will display it in the calendar. The
format is YYYY-MM-DD (year, month and day
separated by a minus sign). |
#endDate
|
Similar to startDate, mentions the end
date if the event spans across multiple days. The date is inclusive, so
the end day is also considered. The attribute can be missing for single-day
events. |
#startTime
|
The time the event starts at. If this value is missing, then the event
is considered a full-day event. The format is HH:MM (hours
in 24-hour format and minutes). |
#endTime
|
Similar to startTime, it mentions the time
at which the event ends (in relation with endDate if
present, or startDate). |
#recurrence
|
This is an optional CalDAV RRULE string
that if present, determines whether a task should repeat or not. Note that
it does not include the DTSTART attribute,
which is derived from the #startDate and
#startTimedirectly. For examples of valid RRULE strings
see https://icalendar.org/rrule-tool.html
|
#color
|
Displays the event with a specified color (named such as red,
grayor hex such as #FF0000). This
will also change the color of the note in other places such as the note
tree. |
#calendar:color
|
❌️ Removed since v0.100.0. Use #color instead.
Similar to #color, but applies the color
only for the event in the calendar and not for other places such as the
note tree. |
#iconClass
|
If present, the icon of the note will be displayed to the left of the event title. |
#calendar:title
|
Changes the title of an event to point to an attribute of the note other
than the title, can either a label or a relation (without the # or
~symbol). See Use-cases for more information. |
#calendar:displayedAttributes
|
Allows displaying the value of one or more attributes in the calendar
like this:
#weight="70" #Mood="Good" #calendar:displayedAttributes="weight,Mood"
It can also be used with relations, case in which it will display the title of the target note: ~assignee=@My assignee #calendar:displayedAttributes="assignee"
|
#calendar:startDate
|
Allows using a different label to represent the start date, other than
startDate(e.g. expiryDate). The
label name must not be prefixed with #.
If the label is not defined for a note, the default will be used instead. |
#calendar:endDate
|
Similar to #calendar:startDate, allows
changing the attribute which is being used to read the end date. |
#calendar:startTime
|
Similar to #calendar:startDate, allows
changing the attribute which is being used to read the start time. |
#calendar:endTime
|
Similar to #calendar:startDate, allows
changing the attribute which is being used to read the end time. |
The calendar displays all the child notes of the Collection that have
a #startDate. An #endDate can
optionally be added.
The start date & end date can easily be edited from the calendar collection itself by clicking on the event. To edit the date while in the event note itself, the following attributes can be added to the Collection note:
#viewType=calendar #label:startDate(inheritable)="promoted,alias=Start Date,single,date"
#label:endDate(inheritable)="promoted,alias=End Date,single,date"
#hidePromotedAttributes
This will result in:
When not used in a Journal, the calendar is recursive. That is, it will look for events not just in its child notes but also in the children of these child notes.
The built in calendar view also supports repeating tasks (e.g. every week, every month as well as more complex recurrency rules).
Starting with v0.105.0, recurrence can be directly edited from the calendar by clicking on an event and then selecting the Repeats option.
If the existing recurrence editor from the event popup is not sufficient,
more complex rules can be manually set via the #recurrence label.
For example, to make a note repeat on the calendar:
#recurrence="FREQ=DAILY;INTERVAL=1"
#recurrence="FREQ=DAILY;INTERVAL=3"
#recurrence="FREQ=WEEKLY;INTERVAL=1"
#recurrence="FREQ=WEEKLY;INTERVAL=2;BYDAY=MO,WE,FR"
#recurrence="FREQ=MONTHLY;INTERVAL=3"
#recurrence="FREQ=MONTHLY;INTERVAL=2;BYDAY=1SU"
#recurrence="FREQ=MONTHLY;INTERVAL=1;BYDAY=-1FR"
For other examples of valid RRULE strings
see https://icalendar.org/rrule-tool.html
Note that the recurrence string does not include the DTSTART attribute
as defined in the iCAL specifications. This is derived directly from the
startDateand startTime attributes
If you want to override the label the calendar uses to fetch the recurrence
string, you can use the #calendar:recurrence attribute.
For example, you can set #calendar:recurrence=taskRepeats.
Then you can set your recurrence string like #taskRepeats="FREQ=DAILY;INTERVAL=1"
Also note that the recurrence label can be made promoted as with the start and end dates.
Trilium's calendar view is powered by FullCalendar, which gives you fine-grained
control over how the time grid looks and behaves for day and week views.
Two labels you can use to configure these views are #calendar:slotDuration and
#calendar:slotLabelInterval. Understanding what each one does —
and how they interact — lets you tailor the calendar to match your workflow,
whether you're scheduling in 15-minute increments or planning out your
day in broad hourly blocks.
These settings can also be adjusted from the Collections tab in the Ribbon.
Controls how tall each time slot is on the calendar — essentially the smallest unit of time the grid is divided into. A shorter duration means more rows and finer granularity; a longer one means fewer, chunkier rows. The default is one row every 15 minutes.
Examples:
| Value | Result |
|---|---|
#calendar:slotDuration="00:15:00"
|
One row every 15 minutes |
#calendar:slotDuration="00:30:00"
|
One row every 30 minutes |
#calendar:slotDuration="01:00:00"
|
One row every hour |
Controls how often a time label appears on the left-hand axis. This is independent of the slot size — you can have very small slots but only label every hour to keep the axis readable. The default is a time label shown every hour.
Examples:
| Value | Result |
|---|---|
#calendar:slotLabelInterval="00:30:00"
|
Show a time label every 30 minutes |
#calendar:slotLabelInterval="01:00:00"
|
Show a time label every hour |
#calendar:slotDuration
|
#calendar:slotLabelInterval
|
Result |
|---|---|---|
00:15:00
|
01:00:00
|
Fine grid, clean axis — good for busy schedules |
00:30:00
|
01:00:00
|
Standard calendar feel |
01:00:00
|
01:00:00
|
Simple hourly grid — good for day planning |
00:15:00
|
00:30:00
|
Fine grid, labels every 30 min — balanced detail |
Both values use HH:mm:ss format. Hours can
go up to 24 (24:00:00),
while minutes and seconds must be between 00 and
59. The minimum meaningful duration is 1 minute (00:01:00).
It is possible to integrate the calendar view into the Journal with day notes. In order to do so change the note type of the Journal note (calendar root) to Collection and then select the Calendar View.
While in journal mode, the popup editor will not show dates, recurrence, colors or removal, since day notes aren't editable events.
Based on the #calendarRoot (or #workspaceCalendarRoot)
attribute, the calendar will know that it's in a calendar and apply the
following:
dateNote attribute
rather than startDate.dateNote attribute. Children
of the child notes will not be displayed.
By default, events are displayed on the calendar by their note title.
However, it is possible to configure a different attribute to be displayed
instead.
To do so, assign #calendar:title to the
child note (not the calendar/Collection note), with the value being
namewhere name can be any label (make
not to add the # prefix). The attribute can
also come through inheritance such as a template attribute. If the note
does not have the requested label, the title of the note will be used instead.
#startDate=2025-02-11 #endDate=2025-02-13 #name="My vacation" #calendar:title="name"
Similarly to using an attribute, use #calendar:title and
set it to name where name is
the name of the relation to use.
Moreover, if there are more relations of the same name, they will be displayed as multiple events coming from the same note.
#startDate=2025-02-14 #endDate=2025-02-15 ~for=@John Smith ~for=@Jane Doe #calendar:title="for"
Note that it's even possible to have a #calendar:title on
the target note (e.g. “John Smith”) which will try to render an attribute
of it. Note that it's not possible to use a relation here as well for safety
reasons (an accidental recursion of attributes could cause the application
to loop infinitely).
#calendar:title="shortName" #shortName="John S."